@file:Suppress("unused", "MemberVisibilityCanBePrivate")

package com.virtualightning.mvvm.utils

import android.app.Activity
import android.os.Handler
import android.os.Looper
import java.lang.RuntimeException
import java.lang.ref.WeakReference

/**
 *  Anchor : Create by CimZzz
 *  Time : 2021/3/11 10:41:54
 *  Project : zxs-new
 *  App 工具类
 */
object AppUtils {
    ///////////////////////////////////////////////////////////////////////////
    // Add by CimZzz on 2021/3/11 下午1:48
    // 内部主线程 Handler
    ///////////////////////////////////////////////////////////////////////////
    private val mainHandler: Handler by lazy { Handler(Looper.getMainLooper()) }

    ///////////////////////////////////////////////////////////////////////////
    // Add by CimZzz on 2021/3/11 上午10:43
    // 判断当前是否处于主线程
    ///////////////////////////////////////////////////////////////////////////
    fun isMainThread() = Looper.getMainLooper() == Looper.myLooper()
    
    ///////////////////////////////////////////////////////////////////////////
    // Add by CimZzz on 2021/3/11 上午10:42
    // 严格主线程检查
    ///////////////////////////////////////////////////////////////////////////
    fun strictMainThread() {
        if(!isMainThread()) {
            throw RuntimeException("必须处于主线程才可正常执行后续操作")
        }
    }

    ///////////////////////////////////////////////////////////////////////////
    // Add by CimZzz on 2021/3/11 下午1:49
    // 在主线程执行回调
    ///////////////////////////////////////////////////////////////////////////
    fun runOnUIThread(runnable: () -> Unit) {
        if(isMainThread()) {
            runnable()
            return
        }
        mainHandler.post(runnable)
    }

    ///////////////////////////////////////////////////////////////////////////
    // Add by CimZzz on 2021/11/12 6:50 下午
    // 在主线程延迟调用
    ///////////////////////////////////////////////////////////////////////////
    fun runOnUIThreadDelay(delay: Long, runnable: () -> Unit) {
        mainHandler.postDelayed(runnable, delay)
    }

    ///////////////////////////////////////////////////////////////////////////
    // Add by CimZzz on 2021/6/5 10:30 PM
    // 持有当前 Activity 弱引用，用来全局获取
    ///////////////////////////////////////////////////////////////////////////
    internal var currentActivity: WeakReference<Activity>? = null

    ///////////////////////////////////////////////////////////////////////////
    // Add by CimZzz on 2021/6/5 10:31 PM
    // 返回当前 Activity
    ///////////////////////////////////////////////////////////////////////////
    fun getCurrentActivity() : Activity? {
        // 该方法必须运行在主线程
//        strictMainThread()
        val activity = currentActivity?.get()?:return null
        if(activity.isFinishing) {
            currentActivity = null
            return null
        }
        return activity
    }
}